package com.example.excelupload.service;

import com.alibaba.excel.EasyExcel;
import com.example.excelupload.model.Person;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

//@Service
//public class ExcelUploadService {
//
//    // 读取Excel文件
//    public List<Person> readExcel(File file) throws IOException {
//        return EasyExcel.read(file).head(Person.class).sheet().doReadSync();
//    }
//
//    // 生成HTML页面
//    public String generateHtml(List<Person> persons) {
//        StringBuilder html = new StringBuilder();
//        html.append("<html><head><meta charset='UTF-8'>")
//                .append("<style>")
//                .append("body { text-align: center; font-family: Arial, sans-serif; }")  // 居中页面内容
//                .append("table { width: 80%; margin: 0 auto; border-collapse: collapse; }") // 表格居中
//                .append("th, td { padding: 10px; text-align: center; border: 1px solid #ddd; height: 40px; width: 150px; }")  // 每行高度和宽度
//                .append("th { background-color: #f2f2f2; }")
//                .append("</style>")
//                .append("</head><body><h1>人员信息</h1><table><thead><tr>")
//                .append("<th>支行</th><th>部门</th><th>姓名</th><th>办电</th><th>内线</th><th>手机</th><th>内部网</th></tr></thead><tbody>");
//
//        String previousDept = null; // 上一个部门值
//        String previousUnitName = null; // 上一个支行值
//
//        // 遍历每一行人员数据
//        for (int i = 0; i < persons.size(); i++) {
//            Person person = persons.get(i);
//
//            // 部门列合并：如果当前行部门为 null，则和上一行合并
//            String deptCell = (person.getDepartment() != null) ? person.getDepartment() : "";
//            String unitCell = (person.getUnitName() != null) ? person.getUnitName() : "";
//
//
//            if (deptCell.isEmpty() && previousDept != null) {
//                deptCell = previousDept;
//            } else {
//                previousDept = person.getDepartment(); // 更新上一行部门
//            }
//
//            if (unitCell.isEmpty() && previousUnitName != null) {
//                unitCell = previousUnitName;
//            } else {
//                previousUnitName = person.getUnitName(); // 更新上一行支行
//            }
//
//            // 输出每行人员信息
//            html.append("<tr>")
//                    .append("<td>").append(unitCell).append("</td>")  // 支行列
//                    .append("<td>").append(deptCell).append("</td>")  // 部门列
//                    .append("<td>").append(person.getName() != null ? person.getName() : "").append("</td>")
//                    .append("<td>").append(person.getDeptPhone() != null ? person.getDeptPhone() : "").append("</td>")
//                    .append("<td>").append(person.getInPhone() != null ? person.getInPhone() : "").append("</td>")
//                    .append("<td>").append(person.getTelPhone() != null ? person.getTelPhone() : "").append("</td>")
//                    .append("<td>").append(person.getInNet() != null ? person.getInNet() : "").append("</td>")
//                    .append("</tr>");
//        }
//
//        html.append("</tbody></table></body></html>");
//        return html.toString();
//    }
//
//    // 保存 HTML 内容到 static 目录
//    public void saveHtmlToStatic(String htmlContent, String filename) throws IOException {
//        Path path = Paths.get("src/main/resources/static/" + filename);
//
//        // 如果文件已经存在，删除它
//        if (Files.exists(path)) {
//            Files.delete(path);
//        }
//
//        // 写入新的 HTML 文件，指定 UTF-8 编码
//        Files.write(path, htmlContent.getBytes("UTF-8"));
//    }
//}
@Service
public class ExcelUploadService {

    // 读取 Excel
    public List<Person> readExcel(File file) throws IOException {
        return EasyExcel.read(file).head(Person.class).sheet().doReadSync();
    }

    // 生成 HTML（支行与部门按连续分组合并，rowspan）
    public String generateHtml(List<Person> persons) {
        StringBuilder html = new StringBuilder();
        html.append("<html><head><meta charset='UTF-8'>")
                .append("<title>人员信息</title>")
                .append("<style>")
                .append("body{font-family:Arial,Helvetica,\"Microsoft YaHei\",sans-serif;margin:0;padding:24px 0;text-align:center;}")
                .append("h1{margin:0 0 16px;}")
                .append("table{width:92%;margin:0 auto;border-collapse:collapse;table-layout:fixed;}")
                .append("th,td{border:1px solid #ddd;padding:10px 12px;text-align:center;vertical-align:middle;}")
                .append("th{background:#f2f2f2;font-weight:700;}")
                .append("td{background:#fff;}")
                .append(".col-unit{width:12%;}.col-dept{width:12%;}.col-name{width:15%;}")
                .append(".col-dp{width:15%;}.col-in{width:15%;}.col-tel{width:16%;}.col-net{width:15%;}")
                .append("</style>")
                .append("</head><body><h1>人员信息</h1>")
                .append("<table><thead><tr>")
                .append("<th class='col-unit'>支行</th>")
                .append("<th class='col-dept'>部门</th>")
                .append("<th class='col-name'>姓名</th>")
                .append("<th class='col-dp'>办电</th>")
                .append("<th class='col-in'>内线</th>")
                .append("<th class='col-tel'>手机</th>")
                .append("<th class='col-net'>内部网</th>")
                .append("</tr></thead><tbody>");

        int n = persons.size();
        if (n == 0) {
            html.append("</tbody></table></body></html>");
            return html.toString();
        }

        // 1) 先前向填充：Excel 合并后的空格在读出来时是 null/空串，这里用上一条非空值顶上
        String[] units = new String[n];
        String[] depts = new String[n];

        String lastUnit = "";
        String lastDept = "";
        for (int i = 0; i < n; i++) {
            String u = trim(persons.get(i).getUnitName());
            String d = trim(persons.get(i).getDepartment());
            if (isEmpty(u)) {
                u = lastUnit;
            } else {
                lastUnit = u;
            }
            if (isEmpty(d)) {
                d = lastDept;
            } else {
                lastDept = d;
            }
            units[i] = u;
            depts[i] = d;
        }

        // 2) 计算每个位置作为“分组首行”时的 rowspan（不是首行则为 0）
        int[] unitSpan = new int[n];
        int[] deptSpan = new int[n];

        // 支行 rowspan
        for (int i = 0; i < n; ) {
            int j = i + 1;
            while (j < n && eq(units[j], units[i])) j++;
            unitSpan[i] = j - i;         // 只有分组首行有值
            // 其余位置保持 0
            i = j;
        }

        // 部门 rowspan（注意：此处同样按“连续相同部门”一段来统计）
        for (int i = 0; i < n; ) {
            int j = i + 1;
            while (j < n && eq(depts[j], depts[i])) j++;
            deptSpan[i] = j - i;
            i = j;
        }

        // 3) 按顺序输出每一行；对支行/部门列：仅当是该分组首行时输出 <td rowspan="N">，后续行跳过这两列
        for (int i = 0; i < n; i++) {
            Person p = persons.get(i);

            String name     = safe(p.getName());
            String deptPh   = safe(p.getDeptPhone());
            String inPh     = safe(p.getInPhone());
            String telPh    = safe(p.getTelPhone());
            String inNet    = safe(p.getInNet());

            html.append("<tr>");

            // 支行列
            if (unitSpan[i] > 0) {
                html.append("<td class='col-unit' rowspan='").append(unitSpan[i]).append("'>")
                        .append(safe(units[i])).append("</td>");
            }
            // 部门列
            if (deptSpan[i] > 0) {
                html.append("<td class='col-dept' rowspan='").append(deptSpan[i]).append("'>")
                        .append(safe(depts[i])).append("</td>");
            }

            // 其它列（每行都输出）
            html.append("<td class='col-name'>").append(name).append("</td>")
                    .append("<td class='col-dp'>").append(deptPh).append("</td>")
                    .append("<td class='col-in'>").append(inPh).append("</td>")
                    .append("<td class='col-tel'>").append(telPh).append("</td>")
                    .append("<td class='col-net'>").append(inNet).append("</td>")
                    .append("</tr>");
        }

        html.append("</tbody></table></body></html>");
        return html.toString();
    }

    // 保存 HTML 到 static
    public void saveHtmlToStatic(String htmlContent, String filename) throws IOException {
        Path path = Paths.get("src/main/resources/static/" + filename);
        if (Files.exists(path)) {
            Files.delete(path);
        }
        Files.createDirectories(path.getParent());
        Files.write(path, htmlContent.getBytes(StandardCharsets.UTF_8));
    }

    // --------- 小工具方法 ---------

    private static String trim(String s) {
        return s == null ? null : s.trim();
    }

    private static boolean isEmpty(String s) {
        return s == null || s.trim().isEmpty();
    }

    private static boolean eq(String a, String b) {
        if (a == null && b == null) return true;
        if (a == null || b == null) return false;
        return a.equals(b);
    }

    private static String safe(String s) {
        return isEmpty(s) ? "" : s;
    }
}
